home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / metamail / contrib / ServiceMail / src / pdinq / getdate / datelex.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-15  |  4.5 KB  |  212 lines

  1. #include <ctype.h>
  2. static char *lptr;
  3.  
  4. yylex()
  5. {
  6.     extern int yylval;
  7.     int sign;
  8.     register char c;
  9.     register char *p;
  10.     char idbuf[20];
  11.  
  12.     while (isspace(*lptr)) lptr++;
  13.  
  14.     if (isdigit(c = *lptr) || c == '-' || c == '+') {
  15.         if (c== '-' || c == '+') {
  16.             if (c=='-') sign = -1;
  17.             else sign = 1;
  18.             if (!isdigit(*++lptr)) {
  19.                 yylval = sign;
  20.                 return (NUMBER);
  21.             }
  22.         } else sign = 1;
  23.         yylval = 0;
  24.         while (isdigit(c = *lptr++)) yylval = 10*yylval + c - '0';
  25.         yylval *= sign;
  26.         lptr--;
  27.         return (NUMBER);
  28.  
  29.     } else if (isalpha(c)) {
  30.         p = idbuf;
  31.         while (isalpha(c = *lptr++) || c=='.')
  32.             *p++ = c;
  33.         *p = '\0';
  34.         lptr--;
  35.         return (lookup(idbuf));
  36.     }
  37.  
  38.     else return (*lptr++);
  39. }
  40.  
  41. struct table {
  42.     char *name;
  43.     int type, value;
  44. };
  45.  
  46. struct table mdtab[] = {
  47.     {"January", MONTH, 1},
  48.     {"February", MONTH, 2},
  49.     {"March", MONTH, 3},
  50.     {"April", MONTH, 4},
  51.     {"May", MONTH, 5},
  52.     {"June", MONTH, 6},
  53.     {"July", MONTH, 7},
  54.     {"August", MONTH, 8},
  55.     {"September", MONTH, 9},
  56.     {"Sept", MONTH, 9},
  57.     {"October", MONTH, 10},
  58.     {"November", MONTH, 11},
  59.     {"December", MONTH, 12},
  60.  
  61.     {"Sunday", DAY, 0},
  62.     {"Monday", DAY, 1},
  63.     {"Tuesday", DAY, 2},
  64.     {"Tues", DAY, 2},
  65.     {"Wednesday", DAY, 3},
  66.     {"Wednes", DAY, 3},
  67.     {"Thursday", DAY, 4},
  68.     {"Thur", DAY, 4},
  69.     {"Thurs", DAY, 4},
  70.     {"Friday", DAY, 5},
  71.     {"Saturday", DAY, 6},
  72.     {0, 0, 0}};
  73.  
  74. struct table mztab[] = {
  75.     {"a.m.", MERIDIAN, AM},
  76.     {"am", MERIDIAN, AM},
  77.     {"p.m.", MERIDIAN, PM},
  78.     {"pm", MERIDIAN, PM},
  79.     {"ast", ZONE, 4},        /* Atlantic */
  80.     {"a.s.t.", ZONE, 4},
  81.     {"adt", DAYZONE, 4},
  82.     {"a.d.t.", DAYZONE, 4},
  83.     {"est", ZONE, 5},        /* Eastern */
  84.     {"e.s.t.", ZONE, 5},
  85.     {"edt", DAYZONE, 5},
  86.     {"e.d.t.", DAYZONE, 5},
  87.     {"cst", ZONE, 6},        /* Central */
  88.     {"c.s.t.", ZONE, 6},
  89.     {"cdt", DAYZONE, 6},
  90.     {"c.d.t.", DAYZONE, 6},
  91.     {"mst", ZONE, 7},        /* Mountain */
  92.     {"m.s.t.", ZONE, 7},
  93.     {"mdt", DAYZONE, 7},
  94.     {"m.d.t.", DAYZONE, 7},
  95.     {"pst", ZONE, 8},        /* Pacific */
  96.     {"p.s.t.", ZONE, 8},
  97.     {"pdt", DAYZONE, 8},
  98.     {"p.d.t.", DAYZONE, 8},
  99.     {"gmt", ZONE, 0},
  100.     {"g.m.t.", ZONE, 0},
  101.         {"z",ZONE,0},
  102.         {"n",ZONE,-1},
  103.         {"o",ZONE,-2},
  104.         {"p",ZONE,-3},        
  105.         {"q",ZONE,-4},        
  106.         {"r",ZONE,-5},        
  107.         {"s",ZONE,-6},        
  108.         {"t",ZONE,-7},        
  109.         {"u",ZONE,-8},        
  110.         {"v",ZONE,-9},        
  111.         {"w",ZONE,-10},        
  112.         {"x",ZONE,-11},        
  113.         {"y",ZONE,-12},        
  114.         {"a",ZONE,1},        
  115.         {"b",ZONE,2},        
  116.         {"c",ZONE,3},        
  117.         {"d",ZONE,4},        
  118.         {"e",ZONE,5},        
  119.         {"f",ZONE,6},        
  120.         {"g",ZONE,7},        
  121.         {"h",ZONE,8},        
  122.         {"i",ZONE,9},        
  123.         {"k",ZONE,10},
  124.         {"l",ZONE,11},        
  125.         {"m",ZONE,12},        
  126.         {0, 0, 0}};
  127.  
  128. struct table unittb[] = {
  129.     {"year", MUNIT, 12},
  130.     {"month", MUNIT, 1},
  131.     {"fortnight", UNIT, 14*24*60},
  132.     {"week", UNIT, 7*24*60},
  133.     {"day", UNIT, 1*24*60},
  134.     {"hour", UNIT, 60},
  135.     {"minute", UNIT, 1},
  136.     {"min", UNIT, 1},
  137.     {"second", SUNIT, 1},
  138.     {"sec", SUNIT, 1},
  139.     {0, 0, 0}};
  140.  
  141. struct table othertb[] = {
  142.     {"tomorrow", UNIT, 1*24*60},
  143.     {"yesterday", UNIT, -1*24*60},
  144.     {"today", UNIT, 0},
  145.     {"now", UNIT, 0},
  146.     {"last", NUMBER, -1},
  147.     {"next", NUMBER, 2},
  148.     {"first", NUMBER, 1},
  149.     /* {"second", NUMBER, 2}, */
  150.     {"third", NUMBER, 3},
  151.     {"fourth", NUMBER, 4},
  152.     {"fifth", NUMBER, 5},
  153.     {"sixth", NUMBER, 6},
  154.     {"seventh", NUMBER, 7},
  155.     {"eigth", NUMBER, 8},
  156.     {"ninth", NUMBER, 9},
  157.     {"tenth", NUMBER, 10},
  158.     {"eleventh", NUMBER, 11},
  159.     {"twelfth", NUMBER, 12},
  160.     {0, 0, 0}};
  161.  
  162. lookup(id) char *id;
  163. {
  164. #define gotit (yylval=i->value,  i->type)
  165. #define getid for(j=idvar, k=id; *j++ = *k++; )
  166.  
  167.     char idvar[20];
  168.     register char *j, *k;
  169.     register struct table *i;
  170.     int abbrev;
  171.  
  172.     getid;
  173.     if (strlen(idvar) == 3) abbrev = 1;
  174.     else if (strlen(idvar) == 4 && idvar[3] == '.') {
  175.         abbrev = 1;
  176.         idvar[3] = '\0';
  177.     }
  178.     else abbrev = 0;
  179.  
  180.     if (islower(*idvar)) *idvar = toupper(*idvar);
  181.  
  182.     for (i = mdtab; i->name; i++) {
  183.         k = idvar;
  184.         for (j = i->name; *j++ == *k++;) {
  185.             if (abbrev && j==i->name+3) return gotit;
  186.             if (j[-1] == 0) return gotit;
  187.         }
  188.     }
  189.  
  190.     getid;
  191.     for (i = mztab; i->name; i++)
  192.         if (strcmp(i->name, idvar) == 0) return gotit;
  193.  
  194.     for (j = idvar; *j; j++) if (isupper(*j)) *j = tolower(*j);
  195.     for (i=mztab; i->name; i++)
  196.         if (strcmp(i->name, idvar) == 0) return gotit;
  197.  
  198.     getid;
  199.     for (i=unittb; i->name; i++)
  200.         if (strcmp(i->name, idvar) == 0) return gotit;
  201.  
  202.     if (idvar[strlen(idvar)-1] == 's') idvar[strlen(idvar)-1] = '\0';
  203.     for (i=unittb; i->name; i++)
  204.         if (strcmp(i->name, idvar) == 0) return gotit;
  205.  
  206.     getid;
  207.     for (i = othertb; i->name; i++)
  208.         if (strcmp(i->name, idvar) == 0) return gotit;
  209.  
  210.     return(ID);
  211. }
  212.